#include <stdio.h>
#include <string.h>
//int main() {
//////    int a[3][4] = {0};
//////    printf("%d\n",sizeof(char));
////    int a[4] = {1,2,3,4};
////    int* b = &a[0];
////    int* c = &a[1];
////    printf("%p\n",b);
////    printf("%p\n",c);
//    int a = 0;
//    int b = 0;
//    printf("%d\n",++a);//1
//    printf("%d\n",a);//1
//    printf("%d\n",++a);//2
//    printf("%d\n",a);//2
//    return 0;
//}

#include <assert.h>
////char* my_strcpy(char* arr2,const char* arr1)
////{
////    assert(arr1);
////    char* p = arr2;
////    while(*arr1 != '\0')
////    {
////        *arr2++ = *arr1++;
////    }//非'\0'赋予了，剩下就是'\0'了。
////    *arr2 = '\0';
////    return p;
////}
//char* my_strcpy(char* arr2,const char* arr1)
//{
//    assert(arr1);
//    char* p = arr2;
//    while(*arr2++ = *arr1++)
//    {
//        ;
//    }//非'\0'赋予了，剩下就是'\0'了。
////    *arr2 = '\0';
//    return p;
//}
//
//int main()
//{
//    char arr1[] = "abcdef";
//    char arr2[20] = {0};
//    my_strcpy(arr2,arr1);
//    printf("%s\n",arr2);
////    printf("%s\n",my_strcpy(arr2,arr1));
//    return 0;
//}

//int main()
//{
//    char ch[] = "zhangpengwei@bitejiuyeke.com";
//    char cp[30] = {0};
//    strcpy(cp,ch);
////    char ca[] = "@.";//法一
////    printf("%s\n",strtok(cp,ca));
////    printf("%s\n",strtok(NULL,ca));
//////    printf("%s\n",strtok(NULL,ca));
////    printf("%s\n",strtok(NULL,ca));
//    const char* p = "@.";//法二
//    printf("%s\n",strtok(cp,p));
//    printf("%s\n",strtok(NULL,p));
////    printf("%s\n",strtok(NULL,ca));
//    printf("%s\n",strtok(NULL,p));
//    return 0;
//}

//int main()
//{
//    int a = 10;
//    char* p =(char*) &a;
//    printf("%p\n",p);
//    return 0;
//}


//int main()
//{
//    int a = 0;
//    int b = 0;
//    int c = 0;
//    int d = 0;
//    for(a = 0;a < 2;a++)
//    {
//        for(b = 0;b < 2;b++)
//        {
//            for(c = 0;c < 2;c++)
//            {
//                for(d = 0;d < 2;d++)
//                {
//                    if(a+b+c+d == 3)
//                        printf("a = %d,b = %d,c = %d,d = %d\n",a,b,c,d);
//                }
//            }
//        }
//    }
//    return 0;
//}




////杨辉三角
////规律：行数：从1到n；
////     列数：第1行1个，第2行2个，第3行3个...
////     数字的值：从第2行开始：每行的第2个值~最后1个值之前的值为（上一行该位置的值）+（（上一行该位置-1）的值）。
////只能是通过二维数组进行数值的计算，要不然单靠循环很难把握。
//int main() {
//    int n = 0;
//    scanf("%d",&n);
//    int arr[n][n];
//    int i = 0;//i控制行数，j控制列数
//    int j = 0;
//    for(i = 0;i < n;i++)
//    {
//        if(i == 0)
//        {
//            printf("%5d ",i+1);
//        }
//        else
//        {
//            for(j = 0;j <= i;j++)
//            {
//                if(j == 0 || j == i)
//                {
//                    arr[i][j] = 1;
//                    printf("%5d ",arr[i][j]);
//                }
//                else
//                {
//                    arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
//                    printf("%5d ",arr[i][j]);
//                }
//            }
//        }
//        printf("\n");
//    }
//    return 0;
//}



////第13题、字符串左旋
////实现一个函数，可以左旋字符串中的k个字符。
////例如：ABCD左旋一个字符得到BCDA;
////     ABCD左旋两个字符得到CDAB.                          CDBA
////应该是指针找到最新的字符，然后把字符到'\0'之间的字符取出往前移k个位置，把源前面的位置的字符移到后面对应的位置。
////创建一个数组放进去。
#include <assert.h>
//void Span(char* arr,int k,int sz,int left)
//{
//    assert(arr);
//    const char* p = arr;
//    int i = 0;
//    while(k--)
//    {
//        char tmp = *arr;//传值不是传址，给地址arr变，*tmp就变。
//        for(i = 1;i < sz-1;i++)
//        {
//            *(arr+(i-1)) = *(arr+i);
//        }
//        *(arr+(sz-2)) = tmp;
//    }
//    printf("%s\n",p);
//}
//int main()
//{
//    char arr[] = "ABCDE";//包含一个'\0'
//    int sz = sizeof(arr)/sizeof(arr[0]);
//    int left = 0;
//    int k = 0;
//    scanf("%d",&k);
//    Span(arr,k,sz,left);
//    return 0;
//}



////第3题、字符串旋转结果
////写一个函数，判断一个字符串是否为另外一个字符串旋转之后的字符串。
////例如：给定s1=AABCD和s2=BCDAA，返回1.
////     给定s1=abcd和s2=ACBD，返回0.
////AABCD左旋一个字符得到ABCDA;
////AABCD左旋两个字符得到BCDAA;
////AABCD右旋一个字符得到DAABC.
//int Judge(char* arr,char* arr_1,int sz,int sz_1,int dir,int k)
//{
//    assert(arr && arr_1);
//    if(sz_1 != sz)//如果你连长度都不相等，那直接不用比较了。
//        return 0;
//    else
//    {
//        char* p = arr;
//        k%=sz;
//        int i = 0;
//        if(dir == 0)//左转
//        {
//            while(k--)
//            {
//                char tmp = *arr;
//                for(i = 0;i < sz;i++)
//                {
//                    arr[i] = arr[i+1];
//                }
//                arr[sz-1] = tmp;
//            }
//            printf("%s\n",p);
//            int count = 0;
//            for(i = 0;i < sz;i++)
//            {
//                if(arr[i] == arr_1[i])
//                    count++;
//            }
//            if(count == sz)
//                return 1;
//            else
//                return 0;
//        }else
//        {
//            while(k--)
//            {
//                char tmp = *(arr+(sz-1));
//                for(i = sz-1;i > 0;i--)
//                {
//                    arr[i] = arr[i-1];
//                }
//                *arr = tmp;
//            }
//            printf("%s\n",p);
//            int count = 0;
//            for(i = 0;i < sz;i++)
//            {
//                if(arr[i] == arr_1[i])
//                    count++;
//            }
//            if(count == sz)
//                return 1;
//            else
//                return 0;
//        }
//    }
//
//}
//int main()
//{
//    char arr[] = "AABCD";
//    char arr_1[] = "BCDAA";
//    int sz = strlen(arr);
//    int sz_1 = strlen(arr_1);
//    int dir = 0;//判断往哪个方向旋转:0-左转；1-右转。
//    int k = 0;//判断旋转几个字符
//    scanf("%d %d",&dir,&k);
//    int ret = Judge(arr,arr_1,sz,sz_1,dir,k);
//    if(ret == 0)
//        printf("No.\n");
//    else
//        printf("Yes.\n");
//    return 0;
//}


//int main()
//{
//    char arr[20] = "abcd";
//    char arr_1[] = "efgh";
////    strcpy(arr,arr_1);
////    printf("%s\n",arr);
////    strcat(arr,arr_1);
////    printf("%s\n",arr);
//    strncpy(arr,arr_1,6);
//    printf("%s\n",arr);
//    return 0;
//}

//int main ()
//{
//    char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
//    int n;
//    puts ("Looking for R2 astromech droids...");
//    for (n=0 ; n<3 ; n++)
//        if (strncmp (str[n],"R2xx",2) == 0)
//        {
//            printf ("found %s\n",str[n]);
//        }
//    printf("%p\n",str[0]);
//    printf("%p\n",&str[0][0]);
//    printf("%p\n",&str[0][0]+1);
//    printf("%p\n",&str[0][1]);
//    printf("%p\n",str[1]);//str[1]=str[0]+1,跳过第一个数组，指向第二个数组的首元素地址。
//    printf("%p\n",&str[0]+1);
//    printf("%p\n",&str[1][0]);
//    return 0;
//}




//小米一面题
int main()
{
    int a[] = {1,2,3,4,5};
    int* p = ((int)(&a+1));
    printf("%d,%d\n",(p+1),*(p-1));


    //验证：
    printf("%p\n",&a);
    printf("%p\n",&a+1);
    printf("%d\n",(int)(&a+1));
    printf("%p\n",(int)(&a+1)+1);
    printf("%d\n",(int)(&a+1)+1);
    //p是int*型，一次跳过个字节，所以p-1从指向5后面的p倒退一格到5前面。
    //&a表示取出数组a的地址，+1跳过整个数组直接来到5后面。(int)(&a+1)表示把该地址值转换成int型数据，但这只是改变了值，并没有改变类型。
    //&(int)(&a+1)整体仍为地址类型，用指针p指向转换后的int数值。
    //所以p+1就是转换后的数值地址加上4个字节，用”%d“的形式打印出来便是某个具体的数值而不是随机值。
    return 0;
}